﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Input;
using Soat.SoPrism.TemplateWizards.Helpers;

namespace Soat.SoPrism.TemplateWizards.WizardWindows.ProjectDescription
{
    /// <summary>
    /// Cette classe représente le Model associé à la Vue ProjectDescription
    /// </summary>
    public class ProjectDescriptionViewModel : INotifyPropertyChanged, IDisposable
    {
        #region INotifyPropertyChanged Members

        /// <summary>
        /// Evènement lorsque qu'une propriété du ModelView est changée
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Evènement lorsque qu'une propriété du ModelView est changée
        /// </summary>
        protected void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
        
        #region View Property

        /// <summary>
        /// Vue à utliser 
        /// </summary>
        public ProjectDescriptionView View { get; private set; }

        #endregion
        
        #region CompanyName Property

        /// <summary>
        /// Membre privée CompanyName
        /// </summary>
        private string companyName;

        /// <summary>
        /// Propriété publique CompanyName
        /// </summary>
        public string CompanyName
        {
            get
            {
                return companyName;
            }
            set
            {
                if (this.companyName != value)
                {
                    this.companyName = value;
                    this.OnPropertyChanged("CompanyName");
                }
            }
        }

        #endregion

        #region ProjectName Property

        /// <summary>
        /// Membre privée ProjectName
        /// </summary>
        private string projectName;

        /// <summary>
        /// Propriété publique ProjectName
        /// </summary>
        public string ProjectName
        {
            get
            {
                return projectName;
            }
            set
            {
                if (this.projectName != value)
                {
                    this.projectName = value;
                    this.OnPropertyChanged("ProjectName");
                }
            }
        }

        #endregion
        
        #region Title Property

        /// <summary>
        /// Membre privée Title
        /// </summary>
        private string title;

        /// <summary>
        /// Propriété publique Title
        /// </summary>
        public string Title
        {
            get
            {
                return title;
            }
            set
            {
                if (this.title != value)
                {
                    this.title = value;
                    this.OnPropertyChanged("Title");
                }
            }
        }

        #endregion
        
        #region ValidateCommand 

        /// <summary>
        /// Commande de validation du formulaire
        /// </summary>
        public ICommand ValidateCommand { get; set; }

        #endregion
        
        #region Constructor

        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        /// <param name="view">Vue associée</param>
        public ProjectDescriptionViewModel(ProjectDescriptionView view)
        {
            this.View = view;
            this.View.Model = this;
            this.ValidateCommand = new DelegateCommand<string>((args) =>
            {
                this.View.Close();
            });
        } 

        #endregion
        
        #region Dispose Methods

        /// <summary>
        /// Implémentation de l'interface Disposable
        /// </summary>
        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// Implémentation de la méthode Dispose
        /// </summary>
        /// <param name="disposing">Disposé ou pas</param>
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                // Ajouter les désabonnements aux évènements
            }
        }

        #endregion

    }
}
